package com.trkj.service;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.trkj.dao.jpa.IEplanOrderDao;
import com.trkj.dao.jpa.IEquipStorageDao;
import com.trkj.dao.jpa.IEquipStroageSaveDao;
import com.trkj.dao.jpa.IStorageDetailsDao;
import com.trkj.dao.mybatis.IEquipStroageSaveMapper;
import com.trkj.pojos.EquipOrder;
import com.trkj.pojos.EquipStorage;
import com.trkj.pojos.EquipStroageSave;
import com.trkj.pojos.StorageDetail;


@Service
@Transactional
public class EquipStorageService {
	@Autowired
	private IEquipStorageDao equipStorageDao;
	@Autowired
	private IStorageDetailsDao storageDetailsDao;
	@Autowired
	private IEquipStroageSaveDao saveDao;
	@Autowired
	private IEplanOrderDao eplanOrderDao;
	@Autowired
	private IEquipStroageSaveDao equipStroageSaveDao;
	@Autowired
	private IEquipStroageSaveMapper equipStroageSaveMapper;
	/**
	 * 生成入库ID
	 * @return
	 */
	public String equipStorageId(){
		String equipStorageId = "";
		//将当前日期格式化为纯数字
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String str = sdf.format(new Date()).substring(2, 8);
		
		String LikeID = "%" + str + "%";
		List<String> list = equipStorageDao.queryEquipStorageId(LikeID);

		if(list.isEmpty()){
			equipStorageId = "US" + str +"0001";
		}else{
			List<Integer> lists = new ArrayList<>();
			for(int i=0;i<list.size();i++){
				lists.add(Integer.valueOf(list.get(i).toString().substring(8, 12)));
			}
			//Collections.max取最大值再加1，拼接住院号
			 int next = Collections.max(lists).intValue()+1;
			 String nextID = String.format("%04d", next);
			 equipStorageId = "US" + str + nextID;
		}
		return equipStorageId;
	}
	/**
	 * 入库
	 * @param businessName 
	 * @param equipStorage
	 * @param storageDetail
	 * @return
	 */
	public boolean saveEquipOrderStroage(String businessName,String equipOrderId, EquipStorage equipStorage, List<StorageDetail> storageDetail) {
		try {
			equipStorageDao.save(equipStorage);	
			String estorageId = equipStorage.getEstorageId();
			//绑定关系
			if(storageDetail != null){
				for(StorageDetail detail: storageDetail){
					String sdetailName = detail.getSdetailName();
					String estorageId2 = detail.getEstorageId();
					Date sdetailMdate = detail.getSdetailMdate();
					Date sdetailEdate = detail.getSdetailEdate();
					//查询库存该批次是否有该设备、耗材，而且是生产日期和有效日期相同
					EquipStroageSave save = equipStroageSaveMapper.findOneBatchDate(sdetailName,sdetailMdate,sdetailEdate,estorageId2);	
					if(save!=null){
						//修改记录的数量
						//新加的
						BigDecimal sdetailNum = detail.getSdetailNum();
						//原来的
						BigDecimal sdetailNum2 = save.getEquipsaveNum();
						save.setEquipsaveNum(sdetailNum.add(sdetailNum2));
					}else{
						//保存新纪录
						EquipStroageSave saveNew=new EquipStroageSave();
						saveNew.setEquipsaveUntil(detail.getSdetailComp());
						saveNew.setEquipsaveName(detail.getSdetailName());
						saveNew.setEquipsaveNum(detail.getSdetailNum());
						saveNew.setEquipsaveBatchid(estorageId);
						saveNew.setEquipsaveBdate(detail.getSdetailMdate());
						saveNew.setEquipsaveEdate(detail.getSdetailEdate());
						saveNew.setEquipsaveType(detail.getSdetailType());
						saveNew.setEquipsaveState("正常");
						saveNew.setEquipsaveBusiness(businessName);
						saveDao.save(saveNew);
					}
					detail.setEstorageId(estorageId);
				}
				storageDetailsDao.save(storageDetail);			
			}
			//修改订单状态
			EquipOrder equipOrder = eplanOrderDao.findOne(equipOrderId);
			equipOrder.setEorderState("已入库");
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 查询出所有库存
	 * @param page
	 * @param rows
	 * @return
	 */
	public Map<String, Object> getequipStroageSave(int page, int rows) {
		Page<EquipStroageSave> p= PageHelper.startPage(page, rows, true);
		List<EquipStroageSave>	list = equipStroageSaveMapper.findAll();
		Map<String,Object> map = new HashMap<>();
		map.put("total", p.getTotal());
		map.put("rows", list);
		return map;
	}
	/**
	 * 条件查询
	 * @param page
	 * @param rows
	 * @param equipsaveBatchId
	 * @param equipsaveBatchName
	 * @param equipsaveBatchEdate
	 * @return
	 */
	public Map<String, Object> getEquipStroageSaveWhere(int page, int rows, String equipsaveBatchId,
			String equipsaveBatchName, String equipsaveBatchEdate) {
		Page<EquipStroageSave> p= PageHelper.startPage(page, rows, true);
		Map<String,Object> map = new HashMap<>();
		map.put("equipsaveBatchId", equipsaveBatchId);
		map.put("equipsaveBatchName", equipsaveBatchName);
		map.put("equipsaveBatchEdate", equipsaveBatchEdate);
		
		List<EquipStroageSave>	list = equipStroageSaveMapper.findWhere(map);
		Map<String,Object> map2 = new HashMap<>();
		map2.put("total", p.getTotal());
		map2.put("rows", list);
		return map2;
	}
	/**
	 *设置库存状态
	 * @param equipsaveid
	 */
	public boolean setEquipSaveState(long equipsaveid) {		
		try {
			EquipStroageSave stroageSave = saveDao.findOne(equipsaveid);
			stroageSave.setEquipsaveState("禁用");
			return true;	
		} catch (Exception e) {
			e.printStackTrace();
			return false;	
		}	
	}
	/**
	 * 删除该库存
	 * @param equipsaveid
	 * @return
	 */
	public boolean EquipSaveMove(long equipsaveid) {
		try {
			EquipStroageSave stroageSave = saveDao.findOne(equipsaveid);
			saveDao.delete(stroageSave);
			return true;	
		} catch (Exception e) {
			e.printStackTrace();
			return false;	
		}	
	}
	/**
	 * 解禁
	 * @param equipsaveid
	 * @return
	 */
	public boolean setEquipSaveStateOk(long equipsaveid) {
		try {
			EquipStroageSave stroageSave = saveDao.findOne(equipsaveid);
			stroageSave.setEquipsaveState("正常");
			return true;	
		} catch (Exception e) {
			e.printStackTrace();
			return false;	
		}	
	}
	/**
	 * 查询禁用的库存
	 * @param page
	 * @param rows
	 * @return
	 */
	public Map<String, Object> getUnableESOlist(int page, int rows) {
		Page<EquipStroageSave> p= PageHelper.startPage(page, rows, true);
		List<EquipStroageSave>	list = equipStroageSaveMapper.findUnableESO();
		Map<String,Object> map2 = new HashMap<>();
		map2.put("total", p.getTotal());
		map2.put("rows", list);
		return map2;
	}
	/**
	 * 查询可以库存
	 * @param page
	 * @param rows
	 * @return
	 */
	public Map<String, Object> getAbleESOlist(int page, int rows) {
		Page<EquipStroageSave> p= PageHelper.startPage(page, rows, true);
		List<EquipStroageSave>	list = equipStroageSaveMapper.findAbleESO();
		Map<String,Object> map2 = new HashMap<>();
		map2.put("total", p.getTotal());
		map2.put("rows", list);
		return map2;
	}
	/**
	 * 条件查询退货
	 * @param page
	 * @param rows
	 * @param businessName
	 * @return
	 */
	public Map<String, Object> getUnableESOlistWhere(int page, int rows, String businessName) {
		Page<EquipStroageSave> p= PageHelper.startPage(page, rows, true);
		Map<String,Object> map = new HashMap<>();
		map.put("businessName", businessName);
		List<EquipStroageSave>	list = equipStroageSaveMapper.findUnableESOWhere(map);
		Map<String,Object> map2 = new HashMap<>();
		map2.put("total", p.getTotal());
		map2.put("rows", list);
		return map2;
	}
	/**
	 * 条件查询领用
	 * @param page
	 * @param rows
	 * @param equipName
	 * @return
	 */
	public Map<String, Object> getAbleESOlistWhere(int page, int rows, String equipName) {
		Page<EquipStroageSave> p= PageHelper.startPage(page, rows, true);
		Map<String,Object> map = new HashMap<>();
		map.put("equipName", equipName);
		List<EquipStroageSave>	list = equipStroageSaveMapper.findAbleESOWhere(map);
		Map<String,Object> map2 = new HashMap<>();
		map2.put("total", p.getTotal());
		map2.put("rows", list);
		return map2;
	}	
}
